/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.senac.academicnet.model;

import br.com.senac.academicnet.model.entidades.AlunoVO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

class AlunoDAO {
    
    AlunoProfessorDAO alunoProfessorDAO = new AlunoProfessorDAO();

    static void incluir(AlunoVO aluno) throws Exception {
        String sql = "INSERT INTO Alunos(nome, matricula, cpf, datanascimento, logradouro, numero, bairro, cidade, uf, telefone, celular, mensalidade)"
                + " VALUES(?,?,?,?,?,?,?,?,?,?,?, ?)";

        Connection conn = null;
        PreparedStatement pstm = null;

        try {
            // Cria uma conexão com o banco
            conn = ConnectionJDBCFactory.getConexao();

            // Cria um PreparedStatment, classe usada para executar a query
            pstm = conn.prepareStatement(sql);

            carregarParametros(pstm, 1, aluno);

            // Executa a sql para inserção dos dados
            pstm.execute();
            
            aluno.setCodigo(getAlunoPorMatricula(aluno.getMatricula()).getCodigo());
            
            //alunoProfessorDAO.incluir(aluno);

        } finally {

            // Fecha as conexões

            try {
                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }
    }

    static void alterar(AlunoVO aluno) throws Exception {

        String sql = "UPDATE Alunos SET nome = ?, matricula = ?, cpf = ?, datanascimento = ?, logradouro = ?, numero = ?, bairro = ?, cidade = ?, uf = ?, telefone = ?, celular = ?, mensalidade = ?"
                + " WHERE codigo = ?";

        Connection conn = null;
        PreparedStatement pstm = null;

        try {
            // Cria uma conexão com o banco
            conn = ConnectionJDBCFactory.getConexao();

            // Cria um PreparedStatment, classe usada para executar a query
            pstm = conn.prepareStatement(sql);

            int indice = 1;
            indice = carregarParametros(pstm, indice, aluno);
            
            pstm.setInt(indice++, aluno.getCodigo());

            // Executa a sql para inserção dos dados
            pstm.execute();
            
            //alunoProfessorDAO.incluir(aluno);

        } finally {

            // Fecha as conexões

            try {
                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }
    }

    static void deletar(AlunoVO aluno) throws Exception {

        String sql = "DELETE FROM Alunos WHERE codigo = ?";

        Connection conn = null;
        PreparedStatement pstm = null;

        try {
            conn = ConnectionJDBCFactory.getConexao();

            pstm = conn.prepareStatement(sql);

            pstm.setInt(1, aluno.getCodigo());

            //alunoProfessorDAO.deletar(aluno);
            
            pstm.execute();
            

        } finally {

            try {
                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }
    }
    
    static void deletarTudo() throws Exception {

        String sql = "delete from Alunos";

        Connection conn = null;
        PreparedStatement pstm = null;

        try {
            conn = ConnectionJDBCFactory.getConexao();

            pstm = conn.prepareStatement(sql);
            
            pstm.execute();

        } finally {

            try {
                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }
    }

    
    static List<AlunoVO> getAlunos() throws Exception {

        String sql;
        sql = "SELECT * FROM Alunos";

        List<AlunoVO> alunos = new ArrayList<>();

        Connection conn = null;
        PreparedStatement pstm = null;
        // Classe que vai recuperar os dados do banco de dados
        ResultSet rset = null;

        try {
            conn = ConnectionJDBCFactory.getConexao();

            pstm = conn.prepareStatement(sql);

            rset = pstm.executeQuery();

            // Enquanto existir dados no banco de dados, faça
            while (rset.next()) {
                // Adiciono o aluno recuperado, a lista de a,lunos
                alunos.add(carregarObjeto(rset));
            }

        } finally {

            try {

                if (rset != null) {

                    rset.close();
                }

                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }

        return alunos;
    }
    
    static AlunoVO getAluno(int codigo) throws Exception {

        String sql;
        sql = "SELECT * FROM Alunos where codigo = ? ";

        AlunoVO aluno = new AlunoVO();
        
        Connection conn = null;
        PreparedStatement pstm = null;
        // Classe que vai recuperar os dados do banco de dados
        ResultSet rset = null;

        try {
            conn = ConnectionJDBCFactory.getConexao();

            pstm = conn.prepareStatement(sql);
            
            pstm.setInt(1, codigo);

            rset = pstm.executeQuery();

            // Enquanto existir dados no banco de dados, faça
            while (rset.next()) {
                // Adiciono o aluno recuperado, a lista de a,lunos
                aluno = carregarObjeto(rset);
            }

        } finally {

            try {

                if (rset != null) {

                    rset.close();
                }

                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }

        return aluno;
    }
    
    static AlunoVO getAlunoPorMatricula(int matricula) throws Exception {

        String sql;
        sql = "SELECT * FROM Alunos where matricula = ? ";

        AlunoVO aluno = new AlunoVO();
        
        Connection conn = null;
        PreparedStatement pstm = null;
        // Classe que vai recuperar os dados do banco de dados
        ResultSet rset = null;

        try {
            conn = ConnectionJDBCFactory.getConexao();

            pstm = conn.prepareStatement(sql);
            
            pstm.setInt(1, matricula);

            rset = pstm.executeQuery();

            // Enquanto existir dados no banco de dados, faça
            while (rset.next()) {
                // Adiciono o aluno recuperado, a lista de a,lunos
                aluno = carregarObjeto(rset);
            }

        } finally {

            try {

                if (rset != null) {

                    rset.close();
                }

                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }

        return aluno;
    }

    static int getProximaMatricula() throws Exception{
        
        int proximaMatricula = 1;
        String sql = "SELECT max(matricula) as maior_matricula FROM Alunos ";
        
        Connection conn = null;
        PreparedStatement pstm = null;
        // Classe que vai recuperar os dados do banco de dados
        ResultSet rset = null;

        try {
            conn = ConnectionJDBCFactory.getConexao();

            pstm = conn.prepareStatement(sql);

            rset = pstm.executeQuery();

            // Enquanto existir dados no banco de dados, faça
            while (rset.next()) {
                // Adiciono o aluno recuperado, a lista de a,lunos
                proximaMatricula = rset.getInt("maior_matricula") + 1;
            }

        } finally {

            try {

                if (rset != null) {

                    rset.close();
                }

                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }

        return proximaMatricula;
    }

    private static  int carregarParametros(PreparedStatement pstm, int indice, AlunoVO aluno) throws SQLException {
        pstm.setString(indice++, aluno.getNome());
        pstm.  setInt(indice++, aluno.getMatricula());
        pstm.  setLong(indice++, aluno.getCpf());
        pstm.  setDate(indice++, new java.sql.Date(aluno.getDataNascimento().getTime()));
        pstm.setString(indice++, aluno.getLogradouro());
        pstm.setString(indice++, aluno.getNumero());
        pstm.setString(indice++, aluno.getBairro());
        pstm.setString(indice++, aluno.getCidade());
        pstm.setString(indice++, aluno.getUf());
        pstm.setString(indice++, aluno.getTelefone());
        pstm.setString(indice++, aluno.getCelular());
        pstm.setDouble(indice++, aluno.getMensalidade());
        
        return indice;
    }

    private static AlunoVO carregarObjeto(ResultSet rset) throws SQLException, Exception {
        AlunoVO aluno = new AlunoVO();
        
        // Recupera o informacoes do banco e atribui ele ao objeto
        aluno.setCodigo(rset.getInt("codigo"));
        aluno.setMatricula(rset.getInt("matricula"));
    
        try{
            aluno.setNome(rset.getString("nome"));
        }catch(Exception e){
        }
        
        aluno.setCpf(rset.getLong("cpf"));
        aluno.setDataNascimento(new java.util.Date(rset.getDate("datanascimento").getTime()));
        aluno.setLogradouro(rset.getString("logradouro"));
        aluno.setBairro(rset.getString("bairro"));
        aluno.setNumero(rset.getString("numero"));
        aluno.setCidade(rset.getString("cidade"));
        aluno.setUf(rset.getString("uf"));
        aluno.setTelefone(rset.getString("telefone"));
        aluno.setCelular(rset.getString("celular"));
        aluno.setMensalidade(rset.getDouble("mensalidade"));
        
        aluno.setProfessores(AlunoProfessorDAO.getProfessores(aluno));
        
        return aluno;
    }
}